package org.finesys.common.es.properties;

import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;

import java.time.Duration;
import java.util.concurrent.TimeUnit;

@Data
@EqualsAndHashCode(callSuper = false)
@ConfigurationProperties(prefix = "fine.elasticsearch")
public class MyElasticsearchProperties extends ElasticsearchProperties {

    //启用加密
    boolean enableEncrypt = false;
    //启用同步连接池
    private boolean enablePool = false;
    //启用异步连接池
    private boolean enableAsyncPool = false;
    //异步连接参数
    //最大连接数
    private int maxConnTotal = 0;
    //一个域名同时正在使用的最多连接数
    private int maxConnPerRoute = 0;
    //连接存活时间
    private long connTimeToLive = -1;
    //连接存活时间单位
    private TimeUnit connTimeToLiveTimeUnit = TimeUnit.MILLISECONDS;

    //连接池参数信息
    //最大连接数
    private int maxTotal = 8;
    //最大空闲连接数
    private int maxIdle = 8;
    //最小空闲连接数
    private int minIdle = 0;
    //获取连接时的最大等待时间
    private Duration maxWaitDuration;

    // 定义最小可回收空闲时间
    private Duration minEvictableIdleDuration;

    // 定义回收器关闭超时时间
    private Duration evictorShutdownTimeoutDuration;

    // 定义软最小可回收空闲时间
    private Duration softMinEvictableIdleDuration;

    // 定义每次回收运行之间的时间间隔
    private Duration timeBetweenEvictionRuns;

    // 定义每次回收运行中的测试次数
    private int numTestsPerEvictionRun;
    // 定义在创建时是否进行测试
    private boolean testOnCreate;

    // 定义在借用时是否进行测试
    private boolean testOnBorrow;

    // 定义在返回时是否进行测试
    private boolean testOnReturn;

    // 定义在空闲时是否进行测试
    private boolean testWhileIdle;

    // 定义回收运行之间的持续时间
    private Duration durationBetweenEvictionRuns;

    // 定义是否启用JMX
    private boolean jmxEnabled;

    // 定义JMX名称前缀
    private String jmxNamePrefix;

    // 定义JMX名称基础
    private String jmxNameBase;

    // 定义回收策略类名
    private String evictionPolicyClassName;

    // 定义在资源耗尽时是否阻塞
    private boolean blockWhenExhausted = true;
    // 定义是否后进先出
    private boolean lifo = true;

}
